﻿using Commission.Resources;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace Commission.Models
{
    public enum AccountType { 
        Direct = 1,
        RollUp = 2, 
        Pairing = 3, // cân chân
        Online = 4,
        Matching = 5, // hoa hồng tái tiêu thụ + unilevel
        Withdraw = 6,
        OnlinePayment = 7, // đăng ký hội viên tuyến dưới
        Order = 8, // mua hàng
        MinusPoint = 9, // khi hết hạn thì số điểm sẽ bị trừ
        SignUp = 10, // tiền đăng ký
        Active = 11, // nang dong
        Input = 12 // nhap tien (dieu chinh)
    };

    public enum TransactionStatus
    {
        Delay = 1, // đang apply
        Cancel = 2,
        Finish = 3 // đã hoàn thành
    }

    public class TransactionHistory
    {
        public TransactionHistory()
        {
            TransactionStatus = TransactionStatus.Finish;
        }

        [Key]
        public int ID { get; set; }

        public int CustomerID { get; set; }
        [ForeignKey("CustomerID")]
        public Customer Customer { get; set; }

        public int? SponsoredCustomerID { get; set; }
        [ForeignKey("SponsoredCustomerID")]
        public Customer SponsoredCustomer { get; set; }

        [Required]
        public AccountType AccountType { get; set; }

        [Column(TypeName = "Date")]
        public DateTime AccountDate { get; set; }

        public decimal Point { get; set; }

        public decimal LeftPoint { get; set; }

        public decimal RightPoint { get; set; }

        /// <summary>
        ///  80% - số tiền này có thể chuyển thành tiền mặt
        /// </summary>
        [Required(
            ErrorMessageResourceType = typeof(AppResource),
            ErrorMessageResourceName = "ErrorAmountIsRequired")]
        [RegularExpression(@"\-*[0-9]*\.?[0-9]+",
            ErrorMessageResourceType = typeof(AppResource),
            ErrorMessageResourceName = "ErrorAmountFormatIsNotGood")]
        public decimal Amount { get; set; }

        /// <summary>
        ///  20 - số tiền này ko thể rút ra, chỉ dùng để mua sản phẩm
        /// </summary>
        public decimal ProductAmount { get; set; }

        [NotMapped]
        public decimal TotalAmount
        {
            get
            {
                return Amount + ProductAmount;
            }
        }

        public string AmountDetail
        {
            get
            {
                if (AccountType == Models.AccountType.Active)
                {
                    return string.Format("{0:#,0}", decimal.Zero)
                        + " / " + string.Format("{0:#,0}", this.ProductAmount);
                }
                else if (AccountType == Models.AccountType.Withdraw
                    || AccountType == Models.AccountType.OnlinePayment
                    || AccountType == Models.AccountType.Order
                    || AccountType == Models.AccountType.SignUp)
                {
                    return string.Format("{0:#,0}", this.Amount)
                        + " / " + string.Format("{0:#,0}", decimal.Zero);
                }
                else { 
                    return string.Format("{0:#,0}", this.Amount)
                    + " / " + string.Format("{0:#,0}", this.ProductAmount);
                }
            }
        }

        [NotMapped]
        public decimal CumulativeAmount80 { get; set; }

        [NotMapped]
        public decimal CumulativeAmount20 { get; set; }

        public string CumulativeAmountDetail
        {
            get
            {
                return string.Format("{0:#,0}", this.CumulativeAmount80)
                    + " / " + string.Format("{0:#,0}", this.CumulativeAmount20);
            }
        }

        [NotMapped]
        public decimal CumulativeAmount { get; set; }

        [Required]
        public TransactionStatus TransactionStatus { get; set; }

        // số hội viên được bảo trợ
        [NotMapped]
        public int SponsorNumbers { get; set; }
        
        // level hiện tại
        [NotMapped]
        public int CurrentLevel { get; set; }

        [NotMapped]
        public bool Checked { get; set; }

        [NotMapped]
        public bool IsReadOnly {
            get
            {
                /*
                if (this.TransactionStatus == Models.TransactionStatus.Delay)
                {
                    return false;
                }

                return true;
                 */

                return false;
            }
        }

        [NotMapped]
        public string DisplayCreatedAt
        {
            get
            {
                return this.CreatedAt.ToString("dd/MM/yyyy HH:mm");
            }
        }

        [NotMapped]
        public string DisplayUpdatedAt
        {
            get
            {
                return this.UpdatedAt.ToString("dd/MM/yyyy HH:mm");
            }
        }
        
        public string Description { get; set; }

        public int CreatedUserId { get; set ;}
        public DateTime CreatedAt { get; set; }

        public int UpdatedUserId { get; set; }

        public DateTime UpdatedAt { get; set; }

        public int? DeletedUserId { get; set; }

        [DataType(DataType.Date)]
        public DateTime? DeletedAt { get; set; }

        public bool ContainName(string userName)
        {
            if (this.Customer != null)
            {
                return this.Customer.UserName.ToUpper().Contains(userName.ToUpper())
                    || this.Customer.Name.ToUpper().Contains(userName.ToUpper());
            }

            return false;
        }
    }
}